package com.li.streamAPI;

import com.li.java2.Employee;
import com.li.java2.EmployeeData;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @author 喂S别闹
 * @create 2022/4/21-10:09
 * @Version 1.0
 * @Description: Stream的中间操作
 */
public class StreamAPITest2 {


    /**
     * @Date: 2022/4/21 10:11
     * @Auther: 喂S别闹
     * @param:
     * @Return: void
     * @Description:筛选与切片
     */
    @Test
    public void test1() {
        List<Employee> list = EmployeeData.getEmployees();
        //filter(Predicate p)---接收 Lambda 从流中排除某些元素。
        Stream<Employee> stream = list.stream();
        stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);

//        limint(n) 截断流  使其元素不超过给定数量
        Stream<Employee> stream1 = list.stream();
        stream1.limit(3).forEach(System.out::println);
        System.out.println();
//        skip(n) -- 跳过元素，返回一个扔掉了前n个元素的流。若流中元素不足n个，则返回
        list.stream().skip(6).forEach(System.out::println);
        System.out.println();
//        distinct()  筛选，通过流所生成元素的hashCode和equals去除重复元素。
        list.add(new Employee(1010, "马云", 30, 3333));
        list.add(new Employee(1010, "马云", 30, 3333));
        list.stream().distinct().forEach(System.out::println);
    }

    /**
     * @Date: 2022/4/21 10:23
     * @Auther: 喂S别闹
     * @param:
     * @Return: void
     * @Description:映射操作
     */
    @Test
    public void test2() {
        List<String> list = Arrays.asList("11", "ab", "asd");
        list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);
        System.out.println();

        //获取员工姓名长度大于三的名字
        List<Employee> list1 = EmployeeData.getEmployees();

        list1.stream().map(e -> e.getName()).filter(name -> name.length() > 3).forEach(System.out::println);
        System.out.println("11111111111");
//        flatMap(Function t) -- 接收一个函数作为参数，将流中的每个值都换成另一个流，然后把所有流连接成一个流

        //练习二  map与flatMap的区别
        Stream<Stream<Character>> streamStream = list.stream().map(StreamAPITest2::fromStringToStream);
        //因为这是stream流中还要个stream
        streamStream.forEach(s -> {
            s.forEach(System.out::println);
        });
        System.out.println("-------");
        list.stream().flatMap(StreamAPITest2::fromStringToStream).forEach(System.out::println);


    }

    public static Stream<Character> fromStringToStream(String str) {
        ArrayList<Character> list = new ArrayList<>();
        for (Character c : str.toCharArray()) {
            list.add(c);
        }
        return list.stream();
    }

    //flatmap的理解在下面
    @Test
    public void test3() {
        ArrayList list1 = new ArrayList();
        list1.add(1);
        list1.add(2);
        list1.add(3);

        ArrayList list2 = new ArrayList();
        list2.add(4);
        list2.add(5);
        list2.add(6);

        list1.add(list2);
        list1.addAll(list2);
        System.out.println(list1);
    }

    /**
     * @Date: 2022/4/21 11:04
     * @Auther: 喂S别闹
     * @param:
     * @Return: void
     * @Description:排序操作
     */
    @Test
    public void test4() {
        //自然排序
        List<Integer> list = Arrays.asList(12, 32, 13, 443, 11, -8);
        list.stream().sorted().forEach(System.out::println);

        List<Employee> employees = EmployeeData.getEmployees();
        //定制排序
        employees.stream().sorted((e1, e2) -> {
            return Integer.compare(e1.getAge(), e2.getAge());
        }).forEach(System.out::println);
    }
}
